package com.atguigu.gmall.cart.config;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.ArrayUtils;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
/*
自定义异常处理器：
    只处理@Async标注方法的异常
 */
@Component
@Slf4j
public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
    @Autowired
    RedisTemplate redisTemplate;
    @Override
    public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
        //打印日志
        log.error("方法：{} 执行出现异常：{} ,参数列表：{}",
                method.getName() , throwable.getMessage() , objects);
        //一定是操作数据库失败了
        //一个用户对应一个购物车，参数中出现的userId代表本次数据库同步失败的 用户id
        //将用户id存入到redis中  同步购物车失败的列表中
        if(ArrayUtils.isNotEmpty(objects)){
            String userId = objects[0].toString();
            BoundListOperations ops = redisTemplate.boundListOps("cart:failed");
            ops.leftPush(userId);// List: 双向链表   left 和 right  可以有序操作
        }
        //定时任务：可以删除该用户数据库的购物车，将redis中该用户的购物车写入到数据库中

    }
}
